Такой шаблон проектирования состоит из двух частей: набора методов и интерфейса lAsyncResult. Методы шаблона имеют следующий вид:
lAsyncResult *BeginXXX(
[InputParams], AsyncCallback *cb, Object *AsyncObject)
[ReturnValue] EndXXX([OutputParams], lAsyncResult *ar);
В шаблоне проектирования XXX обозначает реальный метод, который вызывается асинхронно (например, BeginRead/EndRead для класса System: : IO::FileStream). BeginXXX должен принимать те же входные параметры, что и его синхронный аналог (in, in/out и ref), а также параметры AsyncCallback и AsyncObject. В сигнатуре EndXXX должны присутствовать все выходные параметры (ref, out, in/out) синхронной версии. Этот метод должен возвратить любой объект или значение, которое возвращает синхронная версия данного метода. Он должен также иметь параметр lAsyncResult. Может быть предусмотрен и метод Cancelxxx, если в нем имеется необходимость.
AsyncCallback — делегат, который представляет функцию обратного вызова. public _delegate void AsyncCallback(lAsyncResult *ar);
int Read( // Чтение
_in unsigned char* array _gc[],
int offset, int count);
// int смещение, int счетчик);
А вот асинхронная версия, используемая в шаблоне проектирования:
lAsyncResult *BeginRead(
_in unsigned char* array _gc[],
int offset, int numBytes,
// смещение,
AsyncCallback *userCallback,
Object *stateObject); // Объект
int EndRead(lAsyncResult *asyncResult);
Любое исключение, которое запускается в BeginXXX, должно быть запущено до начала выполнения асинхронных операций. Каждое исключение, связанное с асинхронными операциями, должно быть запущено из метода EndXXX.